package com.zwps.biz.controller.http;

import com.zwps.biz.api.enums.FileStoreCatalogueEnum;
import com.zwps.biz.domain.service.FileManageService;
import com.zwps.biz.api.model.dto.file.UploadFileByUrlDTO;
import com.zwps.biz.api.model.vo.file.FileUploadInfoVO;

import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 文件上传
 * 
 * @ClassName: FileController
 * @Description:
 * @author lyh
 * @date 2023年5月27日 下午3:36:25
 *
 */
@Tag(name = "文件上传")
@RestController
@RequestMapping("file")
@AllArgsConstructor
@Validated
public class FileController {

    private FileManageService fileManageService;

    /**
     * 
     * @Title: uploadFile
     * @Description:
     * @param file
     * @param path
     * @return FileUploadInfoVO
     * @author lyh
     * @date 2023年8月15日 下午5:38:38
     */
    @Hidden
    @Operation(summary = "文件上传")
    @PostMapping
    public FileUploadInfoVO uploadFile(@Valid @NotNull MultipartFile file, @Valid @NotBlank String path) {
        return fileManageService.uploda(file, path);
    }

    /**
     * 
     * @Title: uploadFile
     * @Description:
     * @param file
     * @return FileUploadInfoVO
     * @author lyh
     * @date 2023年8月15日 下午5:38:35
     */
    @Operation(summary = "临时文件上传")
    @PostMapping("temp")
    public FileUploadInfoVO uploadTempFile(@Valid @NotNull MultipartFile file) {
        return fileManageService.uploda(file, FileStoreCatalogueEnum.TEMP.getCode());
    }

    // 生成的接口问题需要调试请求参数类型
//    @Operation(summary = "多文件上传")
//    @PostMapping("multi")
//    public List<FileUploadInfoVO> uploadFile(@Valid @NotNull MultipartFile[] file, @Valid @NotBlank String path) {
//        return fileManageService.uploda(file, path);
//    }

    /**
     * 根据文件地址进行文件上传
     * 
     * @param dto 文件地址 关联表id 关联表名称
     * @return
     */
    @Operation(summary = "文件上传（根据文件地址进行上传）")
    @PostMapping("url")
    public FileUploadInfoVO uploadFileByUrl(@RequestBody @Valid UploadFileByUrlDTO dto) {
        return fileManageService.uploadFileByUrl(dto);
    }

    /**
     * 根据文件地址集合进行文件上传
     * 
     * @param dto 文件地址 关联表id 关联表名称
     * @return
     */
    @Operation(summary = "文件上传（根据文件地址进行上传）")
    @PostMapping("urls")
    public List<FileUploadInfoVO> uploadFileByUrlList(@RequestBody @Valid List<UploadFileByUrlDTO> dto) {
        return fileManageService.uploadFileByUrlList(dto);
    }
}
